package com.demo.java.OD51_100.OD55;

import java.util.Arrays;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Scanner;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【任务混部】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/145597153
 */
public class OdMain {
    public static void main(String[] args) {
        try {
            Scanner s = new Scanner(System.in);
            int taskNum = s.nextInt();  // 任务数量
            int[][] myTasks = new int[taskNum][3];  // 存储任务：开始时间、结束时间、并行度

            // 读取任务信息
            for (int i = 0; i < taskNum; ++i) {
                myTasks[i][0] = s.nextInt();  // 开始时间
                myTasks[i][1] = s.nextInt();  // 结束时间
                myTasks[i][2] = s.nextInt();  // 并行度
            }

            // 按照任务的开始时间进行排序
            Arrays.sort(myTasks, Comparator.comparingInt(a -> a[0]));

            // 优先队列，按照结束时间排序
            PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(Comparator.comparingInt(a -> a));
            int result = 0;

            // 遍历所有任务
            for (int i = 0; i < taskNum; ++i) {
                // 处理可以重用的服务器
                while (!priorityQueue.isEmpty() && priorityQueue.peek() <= myTasks[i][0]) {
                    priorityQueue.poll();  // 移除结束时间小于当前任务开始时间的服务器
                }

                // 将当前任务的并行度数量加入队列
                for (int j = 0; j < myTasks[i][2]; ++j) {
                    priorityQueue.offer(myTasks[i][1]);  // 当前任务的结束时间
                }

                // 更新最大并行度
                result = Math.max(result, priorityQueue.size());
            }

            // 输出最大并行度
            System.out.println(result);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("input error");
        }
    }
}